Attribute VB_Name = "modCBU"
Public Function VerificarCBU(ByVal sNroCBU As String) As Boolean
Dim sBloque1 As String
Dim sBloque2 As String
Dim iTotal As Integer
Dim ddResto As Double
Dim iDigVer As Integer

'separo en cbu en dos bloques
sBloque1 = Mid(sNroCBU, 1, 9)
sBloque2 = Mid(sNroCBU, 10, 13)


'verifico si no cargo todo el cbu
If sBloque1 = "" Or sBloque2 = "" Then
    VerificarCBU = False
    Exit Function
End If

'comienzo verificacion bloque 1 del CBU
iDigVer = ObtenerDigitoVerificadorCBU(Mid(sBloque1, 1, 8), 1)

'verifico si el resto es cero
If Val(Mid(sNroCBU, 9, 1)) <> iDigVer Then
    VerificarCBU = False
    Exit Function
End If

'FIN verificacion bloque 1 CBU

'comienzo verificacion bloque 2 del CBU

'obtengo el digito verificador calculado
iDigVer = ObtenerDigitoVerificadorCBU(Mid(sBloque2, 1, 13), 2)

'verifico si el resto es cero
If Val(Mid(sNroCBU, 23, 1)) <> iDigVer Then
    VerificarCBU = False
    Exit Function
End If

'FIN verificacion bloque 2 CBU

VerificarCBU = True

End Function

Public Function GenerarCBU(ByVal iCodBco As Integer, _
                           ByVal iSucBco As Integer, _
                           ByVal sNroCta As String) As String
Dim sBloque1 As String
Dim sBloque2 As String

'armo el string del bloque1 del codigo CBU
sBloque1 = Format(iCodBco, "0000") & _
             Format(iSucBco, "0000")
sBloque1 = sBloque1 & ObtenerDigitoVerificadorCBU(sBloque1, 1)

'armo el string del bloque2 del codigo CBU
sBloque2 = Format(sNroCta, "0000000000000")
sBloque2 = sBloque2 & ObtenerDigitoVerificadorCBU(sBloque2, 2)

GenerarCBU = sBloque1 & sBloque2


End Function

Private Function ObtenerDigitoVerificadorCBU(ByVal sBloque As String, _
                                            ByVal iNroBloque As Integer) As Integer
Dim ddResto As Double
Dim iTotal As Integer

If iNroBloque = 1 Then
    'multiplico cada digito por su correspondiente ponderador (9713)
    ' y lo acumulo
    iTotal = Val(Mid(sBloque, 1, 1)) * 9
    iTotal = iTotal + Val(Mid(sBloque, 2, 1)) * 7
    iTotal = iTotal + Val(Mid(sBloque, 3, 1)) * 1
    iTotal = iTotal + Val(Mid(sBloque, 4, 1)) * 3
    iTotal = iTotal + Val(Mid(sBloque, 5, 1)) * 9
    iTotal = iTotal + Val(Mid(sBloque, 6, 1)) * 7
    iTotal = iTotal + Val(Mid(sBloque, 7, 1)) * 1
    iTotal = iTotal + Val(Mid(sBloque, 8, 1)) * 3
Else
    'multiplico cada digito por su correspondiente ponderador (9713)
    ' y lo acumulo
    iTotal = Val(Mid(sBloque, 1, 1)) * 3
    iTotal = iTotal + Val(Mid(sBloque, 2, 1)) * 9
    iTotal = iTotal + Val(Mid(sBloque, 3, 1)) * 7
    iTotal = iTotal + Val(Mid(sBloque, 4, 1)) * 1
    iTotal = iTotal + Val(Mid(sBloque, 5, 1)) * 3
    iTotal = iTotal + Val(Mid(sBloque, 6, 1)) * 9
    iTotal = iTotal + Val(Mid(sBloque, 7, 1)) * 7
    iTotal = iTotal + Val(Mid(sBloque, 8, 1)) * 1
    iTotal = iTotal + Val(Mid(sBloque, 9, 1)) * 3
    iTotal = iTotal + Val(Mid(sBloque, 10, 1)) * 9
    iTotal = iTotal + Val(Mid(sBloque, 11, 1)) * 7
    iTotal = iTotal + Val(Mid(sBloque, 12, 1)) * 1
    iTotal = iTotal + Val(Mid(sBloque, 13, 1)) * 3
End If
'divido el valor acumulado por 10 y tomo el resto
ddResto = iTotal Mod 10

'obtengo el digito verificador calculado
ObtenerDigitoVerificadorCBU = IIf(ddResto = 0, 0, 10 - ddResto)

End Function

